/*
 * VentanaPrincipal.h
 *      Author: sebastian
 */

#ifndef VENTANAPRINCIPAL_H_
#define VENTANAPRINCIPAL_H_

#include <gtkmm.h>
#include <gtkmm/button.h>
#include <iostream>
#include "CeldaImagen.h"
#include <vector>
#include "Jsonizable.h"
#include <fstream>
#include "ElegidorDeArchivos.h"
#include "ElegidorDeImagenes.h"
#include <string>
#include <string.h>
#include <map>
#include "enumSpin.h"
#include "../Common/CargaJson.h"
#include "DialogoProbabilidades.h"
#include "DialogoImagen.h"
#include "../Common/ImagenJson.h"

class VentanaPrincipal {
	std::vector<CeldaImagen*> celdas;
	DialogoProbabilidades* dialogo;
	DialogoImagen* dialogoImagen;
	bool sePulsoNuevo;
	std::string editando;
	Gtk::Window* ventana;
	Glib::RefPtr<Gtk::Builder> builder;
	Gtk::Label* lblColumnas;
	Gtk::Entry* txtNombreNivel;
	Gtk::Dialog* cantFilasColumnas;
	Gtk::ScrolledWindow* scroll;
	Gtk::Table* tabla;
	Gtk::Label* numNivelAdvertencia;
	Gtk::Button* nuevo;
	Gtk::Button* editar;
	Gtk::Button* guardar;
	Gtk::Button* salir;
	Gtk::Button* btnSetAgujero;
	Gtk::Button* btnSetFondo;

	Gtk::Box* boxFondo;
	Gtk::Box* boxAgujero;
	std::string pathFondo;
	std::string pathAgujero;
	Gtk::SpinButton* spinMaximoPuntaje;
	Gtk::SpinButton* spinNumeroDeNivel;
	Gtk::SpinButton* spinFila;
	Gtk::SpinButton* spinColumna;
	Gtk::SpinButton* spinNroMaxJugadores;
	Gtk::Button* setearATodos;

	Glib::RefPtr<Gtk::UIManager> m_refUIManager;
	Glib::RefPtr<Gtk::ActionGroup> m_refActionGroup;

	//Accion a tomar si se hace click en el boton Nuevo.
	//Despliega el dialogo para setear filas y columnas y llama a crearTabla().
	void clickNuevo();

	//Accion a tomar si se hace click en el boton Editar.
	//Despliega dialogo de FileChoosser y llama a cargarNivelDesdeArchivo().
	void clickEditar();

	//Accion a tomar si se hace click en el boton Guardar.
	//Guarda el nivel con nombre = nivel_(nro de nivel).json
	void clickGuardar();

	//Accion a tomar si se hace click en el boton Salir.
	//Esconde la ventana princpal.
	void clickSalir();

	//Accion a tomar si se hace click en el boton SetImagen.
	//Despliega un file chooser y setea pathAgujero.
	void clickSetImagenAgujero();

	//Accion a tomar si se hace click en el boton SetFondo.
	//Despliega un file chooser y setea pathFondo.
	void clickSetImagenFondo();

	//Despliega file chooser, crea una nueva tabla y setea los valores de todos
	//los atributos correspondientes.
	void cargarNivelDesdeArchivo(std::string nombre);

	//Libera la memoria de las celdas y limpia el vector de celdas.
	void liberarVectorCeldas();

	//Crea una tabla con (Filas x Columnas) CeldaImagen
	void crearTabla(unsigned int filas, unsigned int columnas);

	//Accion a tomar si se hace click en el boton setearTodas.
	//Despliega el dialogo de las probabilidades y en caso de ser correcta la
	//eleccion, las setea en todas las celdas.
	void clickEstablecerTodas();

	//Comprueba que las celdas esten todas OK.
	bool comprobarEstadoCeldas();

	//Devuelve si hubo al menos un agujero en el nivel.
	bool hayAgujeros();

	//Devuelve true si el archivo ya existe, False si no.
	bool archivoExiste(std::string& path);
	
	//Establece que los generadores de columna no pueden ser agujeros
	void NoAgujerosGeneradorColumna();

	//Muestra mensaje de advertencia.
	//Devuelve True, si apreto Aceptar, False si apreto Cancelar.
	bool pierdeTodo();

	//Transforma un path en solo el nombre del archivo.
	std::string getNombreFromPath(std::string& path);
	
	//Crea el Menu Archivo.
	void crearMenu();
		
public:
	VentanaPrincipal(const Glib::RefPtr<Gtk::Builder>& builder);
	~VentanaPrincipal();

};

#endif /* VENTANAPRINCIPAL_H_ */
